package com.blb.thread;

/**
 * DCL double check lock 双检锁单例模式
 */
public class MySingleton {

    //静态实例 volatile 防止指令重排
    private static volatile MySingleton instance = null;

    //私有构造方法
    private MySingleton(){
        System.out.println("执行了构造方法");
    }

    //返回静态实例的方法
    public static MySingleton getInstance(){
        //判断当对象不为空时，不执行同步块，从而提高性能
        if(instance == null) {
            //保证判断和创建对象原子执行
            synchronized (MySingleton.class) {
                if (instance == null) {
                    instance = new MySingleton();
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        //模拟多线程调用单例模式
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                MySingleton instance = MySingleton.getInstance();
                System.out.println(instance.hashCode());
            }).start();
        }
    }
}
